# 引入线程池执行器（ThreadPoolExecutor）和 as_completed 方法，用于并发执行并按完成顺序处理结果
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
import random

# 模拟调用不同服务的函数，例如请求一个 RESTful 接口
def call_service(name):
    time.sleep(random.uniform(1, 3))  # 模拟请求延迟，随机 1~3 秒
    return f"{name} 返回结果"          # 模拟返回的接口数据

# 服务名称列表，代表需要调用的多个微服务或子系统
services = ['用户服务', '订单服务', '商品服务', '库存服务']

# 记录程序开始时间
start = time.time()

# 创建线程池，最多同时运行 4 个线程（因为有 4 个服务，刚好并发发起）
with ThreadPoolExecutor(max_workers=4) as executor:
    
    # 使用字典表达式提交每个任务到线程池，同时记录每个 Future 对应的服务名
    # key: future对象，value: 服务名称
    futures = {executor.submit(call_service, name): name for name in services}

    # 用于收集每个服务的调用结果
    results = {}

    # 遍历每个已完成的任务（无阻塞顺序，谁先完成谁先返回）
    for future in as_completed(futures):
        name = futures[future]  # 获取当前完成任务对应的服务名称
        try:
            result = future.result()  # 获取该任务的执行结果（会阻塞直到有结果）
            results[name] = result    # 存入结果字典
        except Exception as e:
            results[name] = f"失败：{e}"  # 捕获并记录可能出现的异常

# 打印最终所有服务的聚合结果
print("聚合结果：")
for k, v in results.items():
    print(f"{k}: {v}")

# 打印总耗时（round保留两位小数）
print("总耗时：", round(time.time() - start, 2), "秒")
